/**
 * js 调用 app 方法
 * @author ciwyaitd
 * @author lev
 * @author kobe
 * @description [ 包含的方法: 不一定全，不熟悉的话，还是把整个文件看一看吧
 *      callAppHandler 调用 app 方法
 *      bridgeReady
 *
 *      doAction 页面跳转,会产生新的webview,新的页面后退会看见跳转前的页面，
 *      doLocation 页面跳转，只在当前webview跳转,新的页面后退看不见跳转前的页面
 *      doLoading 产生native loading动画, 传 true/false; loading时按返回,能返回上一个页面
 *      getUser 获取用户信息
 *      getLocation
 *
 *      datePicker(option)
 option: time/date/date_time
 *
 *      takePhoto
 *      selectPhoto
 *      selectMutiPhoto
 *      uploadImg
 *
 *      sendMessage
 *      dial
 *
 *      alert
 *      confirm
 *      sendChoose //传产数给APP调用
 *
 sendControlCMD //设备相关
 queryAllDevice //设备相关
 scanQRCode //扫二维码
 *
 *      registerHandler: 调用格式, 记得一定要先getUser
 registerHandler('functionName', function( data ){});
 //要注册的handler名字,给native调用,未写在下面
 getPhotoFromApp
 receiveControlMSG //设备相关
 *
 */

(function ( lf, factory) {

    lf.component === 'undefined' ? lf.component = {} : lf.component;
    lf.bridgeJs = factory();
    //add by levy: bridgeJs 这个单词总感觉好难拼写
    //以后可以使用appJs来调用
    lf.appJs = lf.bridgeJs;

    window.oldAlert = window.alert;
    window.alert = lf.bridgeJs.alert; //有后面有个参数是callback，原生的alert本身是不阻塞的

    window.debugAlert = function (msg) {
        if(location.href.indexOf('h5.liefengtech.com') == -1){
            oldAlert('生产不会有的 debug 信息: ' + msg);
        }
    };

    window.oldConfirm = window.confirm;
    window.confirm = lf.bridgeJs.confirm;

})( typeof liefeng !== 'undefined' ? liefeng : window.liefeng = {}, function () {
    const lf = liefeng,
        ua = navigator.userAgent,
        systemFlag = getSys(),
        env = getEnv();

    function connectWebViewJavascriptBridge ( callback ) {
        if ( systemFlag == 'Android' ) {
            androidWVJsCallHandler ( callback );
        }
        else if ( systemFlag == "IOS" ) {
            iosWVJsCallHandler ( callback );
        }
    }

    function androidWVJsCallHandler(callback) {
        if (window.WebViewJavascriptBridge) {
            callback(WebViewJavascriptBridge);
        }
        else {
            document.addEventListener(
                'WebViewJavascriptBridgeReady'
                , function() {
                    //define a default handler use init method
                    //这段代码注释掉,抢单/工单处理等页面是不能正常使用.
                    //但如果不注释掉,使用使用了default的处理器,cb中注册处理器将失效.如getPhotoFromApp
                    //mark on 2016/6/20 其实先getUser，再注册handler，就没问题了
                    try {
                        WebViewJavascriptBridge.init(function(message, responseCallback) { });
                    }catch (e) {
                        console.log(e);
                    }finally {
                        callback(WebViewJavascriptBridge)
                    }
                },
                false
            );
        }
    }

    function iosWVJsCallHandler ( callback ) {

        if (window.WebViewJavascriptBridge) {
            return callback(WebViewJavascriptBridge);
        }
        if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); alert('push cb');}

        // 第一次调用进入这里
        window.WVJBCallbacks = [callback];
        var WVJBIframe = document.createElement('iframe');
        WVJBIframe.style.display = 'none';
        WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
        document.documentElement.appendChild(WVJBIframe);
        setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 10)
    }

    function getSys () {
        if(ua.match(/iPhone|iPod/i) != null || ua.match(/iPad/i) != null){
            return 'IOS';
        }
        else if(ua.indexOf('Android') > -1 || ua.indexOf('Linux') > -1) {
            return 'Android';
        }
        else {
            return '';
        }
    }

    /**
     * @desc [判断运行环境是app还是pc]
     * @returns {*}
     */
    function getEnv () {
        //真正的app，会带有LF两个关键词
        if( ua.match(/LF/) == null ) {
            return 'pc';
        }
        return 'app';
    }

    function isDebug () {
        var host_name = location.hostname;
        return (host_name.indexOf('192.168') > -1 || host_name.indexOf('localhost') > -1);
    }

    /**
     * 把目标url转换为绝对url，
     * @param target
     * @param prefix 不传前缀时,使用当前地址的域名作为前缀
     */
    function transformOutsideLink(target, prefix){
        //先处理外部链接
        if(target.indexOf('http') > -1) return target;
        else if(target.indexOf('www') > -1) return 'http://' + target;
        else if(prefix) return prefix + target;

        //以相对路径替换原url
        //TODO 这一句话，还要给上去，让手机可以摇一摇
        var href = location.href,
            index = href.lastIndexOf('/'),
            preUrl = href.substr(0, index + 1);
        return preUrl + target;
    }

    /**
     * @param url 相对或绝对url
     */
    function location4PC(url) {
        url = transformOutsideLink(url);
        location.href = url;

        //if (url.indexOf('http') > -1) {
        //	location.href = url;
        //	return;
        //}

    }

    /**
     * 在url后面添加时间戳
     * @param url 相对或绝对url
     */
    function getUrl4App(url) {
        //var _url = transformOutsideLink(url, env_url),
        var _url = transformOutsideLink(url),
            timestamp = new Date().getTime();

        if(_url.indexOf('?') > -1) { //已有参数
            _url = _url.indexOf('_') > -1 ?
                _url.replace(/_=\d+/, '_=' + timestamp) :
            _url + '&_=' + timestamp; //第一次进入

            return _url;
        }
        else
            return _url + '?_=' + timestamp; //无参数第一次进入

    }

    return {
        /**
         * 这个函数,慎用,不利于debug
         * @desc [通用 调用app功能]
         * @param name 名字
         * @param data 传入的数据, 可以是字符串,也可以是对象
         * @param cb 回调
         */
        callAppHandler: function (name, data, cb) {
            console.warn('call handler ' + name + ', 参数:');
            console.warn(data);

            var callback = function (bridge) {
                bridge.callHandler(
                    name,
                    data,
                    function (data) {
                        data = typeof data === 'string' ? JSON.parse(data) : data;
                        if(cb) cb(data);
                    }
                );
            };

            connectWebViewJavascriptBridge(callback);
        },
        /**
         * @desc [注册app可调用的js函数]
         * @param name 函数名 || 多个函数名和函数的对象
         * @param Fn callback函数
         */
        registerHandler: function (name, Fn) {

            if (name instanceof Object) {
                var opts = name;
                var callback = function (bridge) {
                    for (var i in opts) {
                        bridge.registerHandler(i, opts[i]);
                    }
                };
            }
            else {
                var callback = function (bridge) {
                    bridge.registerHandler(name, Fn)
                }
            }
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * @desc [callhandler从app获取用户信息]
         * @param cb
         * @return result
         */
        getUser: function (cb, param) {
            //因各个user返回的字段不完全一致，需要适配一下,放到全局变量里,只对lfoa页面有效。以后都尽量不要用全局变量了。
            var configUser = function (user) {
                liefeng.userInfo = user;
                //兼容代码
                liefeng.userInfo.id = user.staffId || user.id;
                liefeng.userInfo.phone = user.phone || user.mobile;
            };

            // 兼容pc端调试
            if (env == 'pc') {
                let url = location.href,
                    prefix = 'lfoa';

                if(url.indexOf('-')){
                    if(url.indexOf('finger') > -1 || url.indexOf('property') > -1 ||
                        url.indexOf('yue') > -1 || url.indexOf('store') > -1 || url.indexOf('oa') > -1 || url.indexOf('shopping') > -1){
                        prefix = 'finger';
                    }

                }
                $.ajax({
                    type: 'GET',
                    dataType: 'json',
                    url: '../public/staticJson/'  + prefix + 'User.json',
                    success: function (data) {
                        let user = data.data;
                        configUser(user);
                        cb && cb(user);
                    },
                    error() {
                        console.error('get user ajax error');
                        cb && cb();
                    }
                });
            }
            else {
                //ios 有个版本是 getFingerUser的
                if(systemFlag == 'IOS' && ua.indexOf('Version') == -1){
                    //alert('no version');
                    var callback = function (bridge) {
                        bridge.callHandler(
                            'getFingerUser',
                            {},
                            function (data) {
                                try {
                                    if(!data){
                                        cb({});
                                        return;
                                    }
                                    var dt = typeof(data) == 'object' ? data : JSON.parse(data);



                                    if (dt.code && dt.code == '200') {
                                        let user = dt.data;
                                        configUser(user);
                                        if (cb) {
                                            param != undefined ? cb(param) : cb(user);
                                        }
                                    }
                                    else if(dt.code && dt.code != '200'){
                                        alert('get user code ' + dt.code);
                                    }
                                    else {
                                        //适配getUser 没有 code
                                        if (cb) {
                                            configUser(dt);
                                            param != undefined ? cb(param) : cb(dt);
                                        }
                                    }
                                }
                                catch (Exception) {
                                    if(location.href.indexOf('test') > -1){
                                        alert('生产不会有的提示 getFingerUser error!：' + Exception);
                                    }
                                }
                            }
                        );
                    };
                }
                else {
                    //正常逻辑
                    var callback = function (bridge) {
                        bridge.callHandler(
                            'getUser',
                            {},
                            function (data) {
                                try {
                                    //ios返回的是json
                                    var dt = typeof(data) == 'object' ? data : JSON.parse(data) || {};

                                    if (dt.code && dt.code == '200') {
                                        let user = dt.data;
                                        configUser(user);
                                        if (cb) {
                                            param != undefined ? cb(param) : cb(user);
                                        }
                                    }
                                    else if(dt.code && dt.code != '200'){
                                        alert('get user code ' + dt.code);
                                    }
                                    else {
                                        //适配getUser 没有 code
                                        if (cb) {
                                            configUser(dt);
                                            param != undefined ? cb(param) : cb(dt);
                                        }
                                    }
                                }
                                catch (Exception) {
                                    if(location.href.indexOf('test') > -1){
                                        alert('生产不会有的提示 getUser error!：' + Exception);
                                    }
                                }
                            }
                        );
                    };
                }
                connectWebViewJavascriptBridge(callback);
            }
        },
        /**
         * 用于设置页面的title
         * @param title
         * @param cb
         */
        setTitle: function (title, cb) {
            if(env == 'pc'){
                console.log('setTitle ' + title);
            }
            else {
                var callback = function (bridge) {
                    bridge.callHandler(
                        'setTitle'
                        , {'title': title}
                        , function (data) {
                            cb && cb(data);
                        }
                    );
                };
                connectWebViewJavascriptBridge(callback);
            }
        },
        /**
         * @desc [给app传入跳转操作]
         *         会在请求后面添加时间戳
         * @param url
         * @param title 超过10个字,只取前10个字,后面成为...
         * @param type 一般为null,虎子添加的页面才要.在夜班签到那里
         * @param cb
         */
        doAction: function (url, title = '', type, cb) {
            title = title.length > 10 ? title.substr(0,10) + '...' : title;
            console.log('doAction url ' + url, ' title ' + title);

            if(!url) {
                console.log('url is empty');
                return;
            }
            if (env == 'pc') {
                location4PC(url);
            }
            else {
                var _url = getUrl4App(url),
                    callback = function (bridge) {
                        if (!type) {
                            //正常逻辑
                            bridge.callHandler(
                                'doAction'
                                , {'url': _url, 'title': title}
                                , function (responseData) {
                                    cb && cb();
                                }
                            );
                        } else {
                            //历史原因
                            bridge.callHandler(
                                'doAction'
                                , {'url': _url, 'title': title, 'type': type}
                                , function (responseData) {
                                    cb && cb();
                                }
                            );
                        }
                    };
                connectWebViewJavascriptBridge(callback);
            }
        },
        /**
         * 同一个webview 替换掉当前网页内容
         * 会添加标识： %location
         * @param url
         * @param title
         * @param cb
         */
        doLocation: function (url, title, cb) {
            console.log('doLocation url ' + url);
            if(env == 'pc'){
                location4PC(url);
            }
            else {
                var callback = function (bridge) {
                    bridge.callHandler(
                        'setTitle'
                        , {'title': title}
                        , function (data) {
                            cb && cb(data);
                        }
                    );
                };
                connectWebViewJavascriptBridge(callback);

                var _url = getUrl4App(url);
                location4PC(_url);

            }
        },
        /**
         * app才能查看效果
         * @param flag: true/false
         * @param cb 回调函数
         */
        doLoading: function (flag,cb) {
            if(env == 'pc'){
                console.warn((flag ? '开启' : '关闭') + 'app loading' );
            }
            else {
                lf.bridgeJs.callAppHandler('doLoading', flag, function () {
                    cb && cb();
                });
            }
        },
        /**
         * 关闭当前app webview
         * @param cb
         */
        doClose(cb) {
            if(env == 'pc') {
                console.warn('假装当前页面已关闭，返回上个页面');
                cb && cb();
            }
            else {
                //TODO 直接传函数名,如果成功，则todo去掉
                lf.bridgeJs.callAppHandler('doClose', null, cb);
            }
        },
        /**
         * 注册refresh给app调用，
         * 成功后，会先getUser再执行cb,故cb里可以用user的信息
         * @param cb 可以得到入参 user
         * 		  不传cb,则默认是页面重载
         */
        refresh(cb) {
            console.log('register handler refresh ' + (cb || 'location.reload()'));

            const fn = function () {
                if(!cb) window.location.reload();
                else
                    lf.bridgeJs.getUser(cb);
            };

            lf.bridgeJs.registerHandler({
                refresh() {
                    fn();
                },
                //兼容ios旧版本
                reflesh() {
                    fn();
                }
            });

        },
        /**
         * @desc [调用appAlert 原生 alert]
         * @param  data { title , content }
         * @param cb 回调函数
         */
        alert: function (data, cb) {
            if (env == 'pc') {
                window.oldAlert(data);
                cb && cb();
            }
            else {
                var dt = {},
                    systemFlag = getSys();
                if ( systemFlag == 'Android' ) {
                    dt = data instanceof Object ? {'title': data.title || '提示', 'content': data.content}
                        : {'title': '提示', 'content': data};
                }
                else if ( systemFlag == "IOS" ) {
                    dt = data instanceof Object ? {'title': data.title || '提示', 'content': data.content.toString()}
                        : {'title': '提示', 'content': data.toString()};
                }

                var callback = function (bridge) {
                    bridge.callHandler(
                        'alert',
                        dt,
                        function () {
                            cb && cb();
                        }
                    );
                };

                connectWebViewJavascriptBridge(callback);
            }
        },
        /**
         * @desc [ 调用app 原生 confirm ]
         * @param
         *   如果一个页面只有一个confirm，可以简单点，直接这样调用： confirm(msg, yesCb);
         data {  //一般传 content 以及 yesFn
                 'title': '提示',
                 'content': 具体提示内容,
                 'yesText': '确定',
                 'noText': '取消',
                 'yesFn': 确定时 原生调用的函数名, 默认是yesFn
                 'noFn':'取消时，原生调用的函数名'
             }
         * @param yesCb 确定时的回调函数
         * @param noCb 取消时的回调函数
         */
        confirm: function (dt, yesCb = () => null, noCb = () => console.log('您选择了取消')) {
            if (env == 'pc') {
                window.oldConfirm(typeof dt == 'object' ? dt.content : dt) ?
                    yesCb() : noCb();
            }
            else {
                let yesFnName = dt.yesFn || 'yesFn',
                    noFnName = dt.noFn || 'noFn';

                liefeng.bridgeJs.registerHandler({
                    [yesFnName]: () => yesCb(),//也许可以直接传yesCb TODO
                    [noFnName]: () => noCb()
                });

                var callback = function (bridge) {
                    bridge.callHandler(
                        'confirm',
                        {
                            'title': dt.title || '提示',
                            //有可能只传字符串
                            'content': dt.content || dt || '确定要执行该操作吗?',
                            'yesText': dt.yesText || '确定',
                            'noText': dt.noText || '取消',
                            'yesFn': yesFnName,
                            'noFn': noFnName
                        },
                        function () {
                        }
                    );
                };
                connectWebViewJavascriptBridge(callback);

            }
        },
        /**
         * 没有cb方法
         * @param msg
         */
        toast(msg,cb) {
            if(env == 'pc'){
                console.warn('toast: ' + msg);
                cb && cb();
            }
            else {
                var callback = function (bridge) {
                    bridge.callHandler(
                        'toast',
                        {msg},
                        function () {
                            cb && cb();
                        }
                    );
                };
                connectWebViewJavascriptBridge(callback);
            }
        },
        /**
         * 跳转至native页面,
         * @param viewCode 参数为对象时,可参考address-book.js
         * @param cb
         */
        openNativeView: function (viewCode, cb) {
            console.warn('open native view 参数:');
            console.warn(viewCode);

            var callback = function (bridge) {
                bridge.callHandler(
                    'openNativeView',
                    typeof viewCode === 'object' ? viewCode : {viewCode},
                    function (data) {
                        cb && cb(data);
                    }
                );
            };
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * 调用手机蓝牙设备,
         * @param cb
         */
        getBleMsg: function (cb) {
            if (env == 'pc') console.warn('已经调用蓝牙');
        
            var callback = function (bridge) {
                bridge.callHandler(
                    'getBleMsg',
                    {}
                    , function (data) {
                        console.log('data');
                        cb && cb(data);
                    }
                );
            };
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * 只拍照，安卓调用
         * @param cb
         */
        takePhoto: function (cb) {
            if(env == 'pc') console.error('请用手机查看效果');
            var callback = function (bridge) {
                bridge.callHandler(
                    'takePhoto'
                    , {
                        'function': 'getPhotoFromApp'
                    }
                    , function (data) {
                        cb && cb(data);
                    }
                )
            }
            connectWebViewJavascriptBridge(callback);
        },
        //selectMutiPhoto: function (count, cb) {
        //	if(env == 'pc') console.error('请用手机查看效果');
        //	var callback = function (bridge) {
        //		bridge.callHandler(
        //			'selectMutiPhoto'
        //			, {
        //				count: count,
        //				function: 'getPhotoFromApp'
        //			}
        //			, function (responseData) {
        //				cb && cb(responseData);
        //			}
        //		);
        //	};
        //	connectWebViewJavascriptBridge(callback);
        //},
        /**
         * 选择照片，可以拍照，也可以从相册选取
         * @param count
         * @param cb
         * @param type  0 拍照/相册, 1 拍照, 2 相册
         */
        selectPhoto: function (count = 0, cb, type) {
            if(env == 'pc') console.error('请用手机查看效果');
            if (type == '1' && systemFlag == 'Android') {
                this.takePhoto(cb);
            }
            else {
                var callback = function (bridge) {
                    bridge.callHandler(
                        'selectPhoto'
                        , {
                            count: count,
                            type: type,
                            function: 'getPhotoFromApp'
                        }
                        , function (responseData) {
                            cb && cb(responseData);
                        }
                    );
                };
            }
            connectWebViewJavascriptBridge(callback);
        },
        uploadImg: function (pics, sucCb, failCb) {
            // 若不传入数据 则直接回调
            //TODO pc debug
            if (!pics || env == 'pc') {
                // alert('直接创建报事');
                sucCb && sucCb();
                return;
            }

            !failCb && mui && mui.toast('图片上传中,请耐心等待...');

            if (isDebug && env == 'pc') {
                sucCb && sucCb(img);
                return;
            }



            // debugAlert('即将调用app上传图片接口');
            //进入 app
            var callback = function (bridge) {
                bridge.callHandler(
                    'uploadImg'
                    , {pics}
                    , function (data) {
                        if (!data) {
                            failCb && failCb();
                            if (!failCb) {
                                mui&&mui.toast('图片上传失败,请重试');
                                $('button').toggleClass('ele-hide').next().toggleClass('ele-hide');
                            }
                            return;
                        }
                        var img_ary = data.split(','),
                            headUrl = liefeng.imgPreUrl,
                            img;
                        img_ary = img_ary.map(function (item) {
                            return item.indexOf('http') == -1 ? headUrl + item : item;
                        });
                        img = img_ary.join(',');

                        !failCb && mui && mui.toast('图片上传成功!');
                        sucCb && sucCb(img.toString());
                    }
                );
            };
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * 与组件　DatePicker　结合使用
         * @param option : date/time/date_time
         */
        datePicker: function (option, cb) {

            var dateStr = new Date().toJSON().substr(0,10),
                picker = new mui.DtPicker({"value": dateStr + " 18:30"});

            picker.show(function (rs) {
                cb(rs.text);
                picker.dispose();
            });



            //if(env == 'pc') {
            //	if(!cb)
            //		console.log('datePicker ' + option);
            //	else
            //       cb('datePicker ' + option);
            //}
            //var fn = function (bridge) {
            //	bridge.callHandler(
            //		'datePicker',
            //		{option},
            //		function (data) {
            //			//data = typeof data == 'string' ? JSON.parse(data) : data;
            //			cb && cb(data);
            //		}
            //	);
            //};
            //connectWebViewJavascriptBridge(fn);
        },
        /**
         * 与组件　TimePicker　结合使用
         * @param option : date/time/date_time
         * 商户中心 时间插件
         */
        datePickerAdd: function (option, cb) {

            var dateStr = new Date().toJSON().substr(0,10),
                picker = new mui.DtPicker({"value": dateStr + " 08:00"});

            picker.show(function (rs) {
                cb(rs.text);
                picker.dispose();
            });



            //if(env == 'pc') {
            //	if(!cb)
            //		console.log('datePicker ' + option);
            //	else
            //       cb('datePicker ' + option);
            //}
            //var fn = function (bridge) {
            //	bridge.callHandler(
            //		'datePicker',
            //		{option},
            //		function (data) {
            //			//data = typeof data == 'string' ? JSON.parse(data) : data;
            //			cb && cb(data);
            //		}
            //	);
            //};
            //connectWebViewJavascriptBridge(fn);
        },
        /**
         * 获取地理位置
         * @param cb
         */
        getLocation: function (cb) {
            var callback = function (bridge) {
                bridge.callHandler(
                    'getLocation'
                    , 'nothing'
                    , function (data) {
                        console.log(data)
                        data = typeof data == 'object' ? data : JSON.parse(data);
                        cb && cb(data);
                    }
                )
            }
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * 打电话
         * @param phone
         */
        dial: function (phone) {
            if(env == 'pc') console.log(phone);
            var callback = function (bridge) {
                bridge.callHandler(
                    'dial'
                    , phone
                    , function (responseData) {
                        //console.log('response');
                        //cb && cb();
                    }
                );
            };
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * 发消息
         * @param phone
         */
        sendMessage: function (phone) {
            var callback = function (bridge) {
                bridge.callHandler(
                    'sendMessage'
                    , phone
                    , function (responseData) {
                        //console.log('response');
                        //cb && cb();
                    }
                );
            };
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * 支付
         * @param data
         * @param cb
         */
        pay(data = {}, cb) {
            console.warn('请使用手机支付, 支付参数:');
            console.log(data);
            console.log(cb);

            var callback = function (bridge) {
                bridge.callHandler(
                    'pay',
                    data,
                    function (responseData) {
                        cb && cb(responseData);
                    }
                );
            };
            connectWebViewJavascriptBridge(callback);
        },
        /******指点******/

        /**
         * 获得所有设备信息
         */
        queryAllDevice: function (cb) {
            if (env == 'pc') {
                setTimeout(function () {
                    $.ajax({
                        type: 'GET',
                        dataType: 'json',
                        url: '/api/deviceInfo.json',//本地调试
                        success: function (data) {
                            //console.log(data);
                            cb && cb(data);
                        },
                        error: function () {
                            $.ajax({
                                type: 'GET',
                                dataType: 'json',
                                url: '../public/staticJson/deviceInfo.json',//服务器调试
                                success: function (data) {
                                    //console.log(data);
                                    cb && cb(data);
                                }
                            });
                        }
                    });
                },5000)
            }
            else {
                var fn = function (bridge) {
                    bridge.callHandler(
                        'queryAllDevice',
                        {},
                        function (data) {
                            console.log(data);
                            data = typeof data == 'string' ? JSON.parse(data) : data;
                            cb && cb(data);
                        }
                    );
                };
                connectWebViewJavascriptBridge(fn);
            }

        },
        /**
         * 发送命令给设备
         * @param cmd
         */
        sendControlCMD: function (cmd, cb) {
            if(env == 'pc'){
                console.log('sendControlCMD',cmd);
            }
            else {
                var fn = function (bridge) {
                    bridge.callHandler(
                        'sendControlCMD',
                        {cmd},
                        function (data) {
                            cb && cb(data);
                        }
                    );
                };
                connectWebViewJavascriptBridge(fn);
            }
        },
        /**
         * 开门
         * @param doorCode
         * @param cb
         */
        openDoor: function (doorCode, cb) {
            if(env == 'pc')
                console.log('doorCode ' + doorCode);
            else {
                var fn = function (bridge) {
                    bridge.callHandler(
                        'openDoor',
                        {doorCode},
                        function (data) {
                            cb && cb(data);
                        }
                    );
                };
                connectWebViewJavascriptBridge(fn);
            }
        },
        /**
         * 执行场景
         * @param scene 数字:0~7
         * @param cb
         */
        executeScene: function (scene, cb) {
            if(env == 'pc')
                console.log('scene ' + scene);
            else {
                var fn = function (bridge) {
                    bridge.callHandler(
                        'executeScene',
                        {scene},
                        function (data) {
                            cb && cb(data);
                        }
                    );
                };
                connectWebViewJavascriptBridge(fn);
            }
        },
        sign: function () {
            var callback = function (bridge) {
                bridge.callHandler(
                    'sign'
                    , 'nothing'
                    , function (responseData) {

                    }
                )
            }
            connectWebViewJavascriptBridge(callback);
        },
        getSignOther: function () {
            var callback = function (bridge) {
                bridge.callHandler(
                    'getSignOther'
                    , 'nothing'
                    , function (responseData) {

                    }
                )
            };
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * @deprecated 不需要使用它了
         * @desc [等待app的webviewbridge准备好后回调的函数]
         * 　要这样子才可以registerHandler
         * @param Fn 传入要执行的匿名函数
         */
        bridgeReady: function (Fn) {
            var callback = function () {
                Fn && Fn(liefeng, React);
            };
            if (env == 'pc') {
                callback();
            }
            else {
                connectWebViewJavascriptBridge(callback);
            }
        },
        /**
         * @deprecated 当时没有先getUser, 所以不对
         * 参考report.js里 getPhotoFromApp 的使用.
         * 不得已才写的这个方法
         * @param callback
         */
        connectBridge2RegisterHandler: function (callback) {

            if (systemFlag == 'Android') {
                if (window.WebViewJavascriptBridge) {
                    callback(WebViewJavascriptBridge);
                }
                else {
                    document.addEventListener(
                        'WebViewJavascriptBridgeReady'
                        , function () {
                            //与androidWVJsCallHandler不同在于:少了init方法
                            callback(WebViewJavascriptBridge)
                        },
                        false
                    );
                }
            }
            else if (systemFlag == "IOS") {
                iosWVJsCallHandler(callback);
            }
        },
        /**
         * 获取ibeacon数据
         * @param uuid: 设备uuid
         * @param cb 回调函数
         */
        getIBeaconInfo: function (uuid,cb) {
            var callback = function (bridge) {
                bridge.callHandler(
                    'getIBeaconInfo'
                    , {proximityUuid:uuid}
                    , function (data) {
                        try{
                            data = typeof data == 'string' ? JSON.parse(data) : data;
                        }catch(e){

                        }
                        cb && cb(data);
                    }
                );
            };
            connectWebViewJavascriptBridge(callback);
        },
        /**
         * 选中后传选中的参数给app调用，例子再address-book-select.js
         */
        sendChoose(data) {

            let info = data || [];
            lf.bridgeJs.registerHandler("sendChoose", (data, responseCallback) => {
                var responseData = info;
                responseCallback(responseData);
            });
        },
    }
});
